/**
 * 地图管理器类
 * 封装腾讯地图相关操作
 */

// 引入腾讯地图SDK
const QQMapWX = require('../libs/qqmap-wx-jssdk.min.js');

class MapManager {
  /**
   * 构造函数
   * @param {String} mapId 地图容器ID
   */
  constructor(mapId) {
    this.mapId = mapId;          // 地图容器ID
    this.map = null;             // 地图实例
    this.mapContext = null;      // 地图上下文
    this.is3DMode = false;       // 是否为3D模式
    this.eventListeners = {};    // 事件监听器
    this.mapKey = 'YOUR_TENCENT_MAP_KEY'; // 腾讯地图Key，请替换为实际的Key
    this.defaultCenter = { latitude: 39.908823, longitude: 116.397470 }; // 默认中心点（北京天安门）
    this.defaultZoom = 16;       // 默认缩放级别
  }

  /**
   * 初始化地图
   * @returns {Promise} 初始化完成的Promise
   */
  async initMap() {
    return new Promise((resolve, reject) => {
      try {
        // 检查权限
        this.checkPermission().then(() => {
          // 创建地图实例
          this.createMapInstance();
          
          // 获取用户位置
          this.getUserLocation().then(location => {
            // 设置地图中心点
            this.setCenter(location.latitude, location.longitude);
            resolve();
          }).catch(err => {
            console.warn('获取用户位置失败，使用默认位置:', err);
            // 使用默认位置
            this.setCenter(this.defaultCenter.latitude, this.defaultCenter.longitude);
            resolve();
          });
        }).catch(err => {
          console.error('权限检查失败:', err);
          reject(err);
        });
      } catch (error) {
        console.error('地图初始化失败:', error);
        reject(error);
      }
    });
  }

  /**
   * 检查地图所需权限
   * @returns {Promise}
   */
  async checkPermission() {
    return new Promise((resolve, reject) => {
      uni.authorize({
        scope: 'scope.userLocation',
        success: () => {
          resolve();
        },
        fail: (err) => {
          console.warn('获取位置权限失败:', err);
          // 即使权限获取失败，也继续初始化地图，只是使用默认位置
          resolve();
        }
      });
    });
  }

  /**
   * 创建地图实例
   */
  createMapInstance() {
    try {
      // 创建腾讯地图SDK实例
      const qqMapSdk = new QQMapWX({
        key: this.mapKey
      });
      
      // 创建地图上下文
      this.mapContext = uni.createMapContext(this.mapId, this);
      
      // 初始化地图
      this.map = this.mapContext;
      
      // 配置地图
      this.configMap();
      
      // 注册地图事件
      this.registerMapEvents();
      
      console.log('地图实例创建成功');
    } catch (error) {
      console.error('创建地图实例失败:', error);
      throw error;
    }
  }

  /**
   * 配置地图
   */
  configMap() {
    // 设置地图配置
    this.mapContext.setMapType({
      type: 'NORMAL', // 普通地图
      complete: (res) => {
        console.log('设置地图类型完成:', res);
      }
    });
    
    // 显示指南针
    this.mapContext.showCompass({
      success: () => {
        console.log('显示指南针成功');
      }
    });
    
    // 显示比例尺
    this.mapContext.showScale({
      success: () => {
        console.log('显示比例尺成功');
      }
    });
  }

  /**
   * 注册地图事件
   */
  registerMapEvents() {
    // 地图加载完成事件
    setTimeout(() => {
      this.trigger('map_loaded');
    }, 1000);
    
    // 其他事件可以在这里注册
  }

  /**
   * 获取用户位置
   * @returns {Promise} 包含位置信息的Promise
   */
  async getUserLocation() {
    return new Promise((resolve, reject) => {
      uni.getLocation({
        type: 'gcj02',
        success: (res) => {
          resolve({
            latitude: res.latitude,
            longitude: res.longitude
          });
        },
        fail: (err) => {
          console.warn('获取位置失败:', err);
          reject(err);
        }
      });
    });
  }

  /**
   * 设置地图中心点
   * @param {Number} latitude 纬度
   * @param {Number} longitude 经度
   */
  setCenter(latitude, longitude) {
    if (!this.mapContext) return;
    
    this.mapContext.moveToLocation({
      latitude,
      longitude,
      success: () => {
        console.log('设置中心点成功');
      },
      fail: (err) => {
        console.error('设置中心点失败:', err);
      }
    });
  }

  /**
   * 切换到3D模式
   */
  switchTo3D() {
    if (!this.mapContext) return;
    
    // 微信小程序地图目前支持有限的3D效果
    // 这里通过调整俯视角和旋转角来模拟3D效果
    this.mapContext.changeViewBy({
      skew: 30, // 倾斜角度
      rotate: 0, // 旋转角度
      scale: 16, // 缩放级别
      duration: 1000, // 动画时长
      success: () => {
        console.log('切换到3D模式成功');
        this.is3DMode = true;
      },
      fail: (err) => {
        console.error('切换到3D模式失败:', err);
      }
    });
  }

  /**
   * 重置视图
   */
  resetView() {
    if (!this.mapContext) return;
    
    this.mapContext.changeViewBy({
      skew: 0,
      rotate: 0,
      scale: this.defaultZoom,
      duration: 1000,
      success: () => {
        console.log('重置视图成功');
        this.is3DMode = false;
      },
      fail: (err) => {
        console.error('重置视图失败:', err);
      }
    });
  }

  /**
   * 添加事件监听
   * @param {String} event 事件名称
   * @param {Function} callback 回调函数
   */
  on(event, callback) {
    if (!this.eventListeners[event]) {
      this.eventListeners[event] = [];
    }
    this.eventListeners[event].push(callback);
  }

  /**
   * 触发事件
   * @param {String} event 事件名称
   * @param {Any} data 事件数据
   */
  trigger(event, data) {
    const listeners = this.eventListeners[event];
    if (listeners && listeners.length > 0) {
      listeners.forEach(callback => {
        callback(data);
      });
    }
  }

  /**
   * 销毁地图实例，释放资源
   */
  destroy() {
    this.eventListeners = {};
    this.map = null;
    this.mapContext = null;
    console.log('地图资源已释放');
  }
}

export default MapManager;